#include "Listnode.h"

ListNode* ListCreate()
{
    ListNode* newnode = (ListNode*)malloc(sizeof(ListNode));
    if(newnode == NULL)
    {
        perror("malloc fail");
        exit(-1);
    }

    newnode->prev = newnode;
    newnode->next = newnode;
    return newnode;
}

// 双向链表销毁
void ListDestory(ListNode* plist)
{
    assert(plist);
    while(plist->next != plist)
    {
        ListPopBack(plist);
    }
    free(plist);
}

// 双向链表打印
void ListPrint(ListNode* plist)
{
    assert(plist);
    ListNode* cur = plist->next;
    printf("head <->");
    while(cur != plist)
    {
        printf("%d <-> ",cur->_data);
        cur = cur->next;
    }
    printf("head\n");
}

// 双向链表尾插
void ListPushBack(ListNode* plist, LTDataType x)
{
    // assert(plist);
    // ListNode* newnode = ListCreate();
    // newnode->prev = plist->prev;
    // plist->prev = newnode;
    // newnode->next = plist;
    // newnode->prev->next = newnode;

    // newnode->_data = x;
    ListInsert(plist,x);
}

// 双向链表尾删
void ListPopBack(ListNode* plist)
{
    // assert(plist);
    // assert(plist->next != plist);

    // ListNode* del = plist->prev;//保存尾节点

    // //尾删
    // del->prev->next = plist;
    // plist->prev = del->prev;

    // free(del);
    ListErase(plist->prev);
}

// 双向链表头插
void ListPushFront(ListNode* plist, LTDataType x)
{
    // assert(plist);
    // ListNode* newnode = ListCreate();

    // newnode->prev = plist;
    // newnode->next = plist->next;
    // plist->next = newnode;
    // newnode->next->prev = newnode;

    // newnode->_data = x;
    ListInsert(plist->next,x);
}

// 双向链表头删
void ListPopFront(ListNode* plist)
{
    // assert(plist);
    // assert(plist->next != plist);

    // ListNode* del = plist->next;
    // plist->next = del->next;
    // del->prev->prev = plist;

    // free(del);
    ListErase(plist->next);
}

// 双向链表查找
ListNode* ListFind(ListNode* plist, LTDataType x)
{
    assert(plist);
    ListNode* cur = plist->next;
    while(cur != plist)
    {
        if(cur->_data == x)
        {
            return cur;
        }
        cur = cur->next;
    }
    return plist;
}

// 双向链表在pos的前面进行插入
void ListInsert(ListNode* pos, LTDataType x)
{
    assert(pos);
    ListNode* newnode = ListCreate();
    newnode->prev = pos->prev;
    newnode->next = pos;
    newnode->prev->next = newnode;
    pos->prev = newnode;

    newnode->_data = x;
}

// 双向链表删除pos位置的结点
void ListErase(ListNode* pos)
{
    assert(pos);
    assert(pos->next != pos);
    pos->prev->next = pos->next;
    pos->next->prev = pos->prev;
    free(pos);
}






